/// 专用TS到MP4转换工具
/// Author: Lily
/// 
/// 用于将真实下载的TS文件转换为MP4格式

use std::path::Path;
use tokio::fs::File;
use tokio::io::AsyncReadExt;
use videoDownloader::converter::{ConverterFactory, ConversionOptions};
use videoDownloader::error::DownloadResult;

#[tokio::main]
async fn main() -> DownloadResult<()> {
    println!("🎬 专用TS到MP4转换工具");
    println!("===================================");
    
    // 检查输入文件
    let input_file = "video_real_test.ts";
    if !Path::new(input_file).exists() {
        println!("❌ 错误：找不到输入文件 {}", input_file);
        println!("💡 请先运行主程序下载TS文件");
        return Ok(());
    }
    
    let metadata = std::fs::metadata(input_file)?;
    println!("📄 输入文件: {}", input_file);
    println!("📊 文件大小: {:.2} MB", metadata.len() as f64 / 1024.0 / 1024.0);
    
    // 创建TS到MP4转换器
    println!("🔧 创建高性能TS到MP4转换器...");
    let mut converter = ConverterFactory::create_ts_to_mp4_converter(1024 * 1024); // 1MB缓冲区
    
    // 读取整个TS文件
    println!("📖 读取TS文件数据...");
    let mut file = File::open(input_file).await?;
    let mut buffer = Vec::new();
    file.read_to_end(&mut buffer).await?;
    
    println!("✅ 成功读取 {:.2} MB 数据", buffer.len() as f64 / 1024.0 / 1024.0);
    
    // 验证TS文件格式
    if buffer.len() >= 188 && buffer[0] == 0x47 {
        let packet_count = buffer.len() / 188;
        println!("📺 验证成功：包含 {} 个TS包 (188字节/包)", packet_count);
    } else {
        println!("⚠️ 警告：文件可能不是标准TS格式");
    }
    
    // 添加数据到转换器
    println!("💾 添加数据到转换器...");
    converter.add_data(&buffer);
    
    // 执行转换
    let output_file = "video_real_test.mp4";
    println!("🎬 开始TS到MP4转换...");
    println!("📤 输出文件: {}", output_file);
    
    let options = ConversionOptions {
        output_format: "mp4".to_string(),
        quality: None,
        preserve_encoding: true,
        custom_params: Vec::new(),
    };
    
    let output_path = Path::new(output_file);
    converter.convert_with_options(output_path, &options).await?;
    
    // 验证转换结果
    if output_path.exists() {
        let output_metadata = std::fs::metadata(output_path)?;
        println!("✅ MP4转换成功完成！");
        println!("📄 输出文件: {}", output_file);
        println!("📊 输出大小: {:.2} MB", output_metadata.len() as f64 / 1024.0 / 1024.0);
        println!("📈 转换效率: {:.1}%", 
            (output_metadata.len() as f64 / metadata.len() as f64) * 100.0);
        
        // 验证MP4文件头
        let mut file = File::open(output_path).await?;
        let mut header = [0u8; 12];
        if file.read_exact(&mut header).await.is_ok() {
            if &header[4..8] == b"ftyp" {
                println!("✅ MP4文件头验证通过！");
                let brand = std::str::from_utf8(&header[8..12]).unwrap_or("unknown");
                println!("📋 MP4品牌: {}", brand);
            }
        }
        
        println!("\n🎉 转换完成！");
        println!("💡 您可以使用以下工具测试MP4文件：");
        println!("   - VLC播放器：vlc {}", output_file);
        println!("   - FFplay：ffplay {}", output_file);
        println!("   - MediaInfo：mediainfo {}", output_file);
        println!("   - FFprobe：ffprobe -v quiet -print_format json -show_format {}", output_file);
        
    } else {
        println!("❌ 错误：MP4文件未生成");
    }
    
    Ok(())
}